package fachade;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import negocio.Campania;
import negocio.Carrier;
import negocio.Cliente;
import negocio.Cobro;
import negocio.Comercial;
import negocio.Concepto;
import negocio.Empleado;
import negocio.Empresa;
import negocio.Localidad;
import negocio.NumCorto;
import negocio.Pago;
import negocio.Solicitud;
import negocio.TraficoNumCorto;
import entity.CampaniaBD;
import entity.ConceptoBD;
import entity.EmpleadoBD;
import entity.EmpresaBD;
import entity.LocalidadBD;
import entity.SolicitudBD;
import entity.TraficoNumCortoBD;

public class PrincipalFachade {

	private static PrincipalFachade iPrincipalFachade;
	private SolicitudNumeroCortoFachade iSolicitudNumeroCortoFachade = null;
	private ComprobantesFachade iComprobantesFachade = null;
	private EmpresaFachade iEmpresaFachade = null;
	private ConceptosFachade iConceptosFachade = null;
	private UsuariosFachade iUsuariosFachade = null;
	private TraficoFachade iTraficoFachade = null;
	private CampaniaFachade iCampaniaFachade = null;
	
	public static PrincipalFachade getInstance() {
		if(iPrincipalFachade == null)
			iPrincipalFachade = new PrincipalFachade();
		return iPrincipalFachade;
	}

	private PrincipalFachade(){
		this.iConceptosFachade = new ConceptosFachade();
		this.iSolicitudNumeroCortoFachade = new SolicitudNumeroCortoFachade();
		this.iComprobantesFachade = new ComprobantesFachade();
		this.iEmpresaFachade = new EmpresaFachade();
		this.iUsuariosFachade = new UsuariosFachade();
		this.setITraficoFachade(new TraficoFachade());
		this.setICampaniasFachade(new CampaniaFachade());
	}

	public SolicitudNumeroCortoFachade getSolicitudesFachade() {
		return this.iSolicitudNumeroCortoFachade;
	}

	public ConceptosFachade getiConceptosFachade() {
		return iConceptosFachade;
	}

	public static PrincipalFachade getiPrincipalFachade() {
		return iPrincipalFachade;
	}

	public static void setiPrincipalFachade(PrincipalFachade iPrincipalFachade) {
		PrincipalFachade.iPrincipalFachade = iPrincipalFachade;
	}

	public SolicitudNumeroCortoFachade getiSolicitudNumeroCortoFachade() {
		return iSolicitudNumeroCortoFachade;
	}

	public void setiSolicitudNumeroCortoFachade(
			SolicitudNumeroCortoFachade iSolicitudNumeroCortoFachade) {
		this.iSolicitudNumeroCortoFachade = iSolicitudNumeroCortoFachade;
	}

	public ComprobantesFachade getiComprobantesFachade() {
		return iComprobantesFachade;
	}

	public void setiComprobantesFachade(ComprobantesFachade iComprobantesFachade) {
		this.iComprobantesFachade = iComprobantesFachade;
	}

	public EmpresaFachade getiEmpresaFachade(){
		return iEmpresaFachade;
	}
	
	public Solicitud convertSolicitudBdToModel(SolicitudBD solicitudesPendientes) {
		Solicitud tmpSolicitud = new Solicitud();
		tmpSolicitud.setEmpleado(this.convertirEmpleadoBdToModel(solicitudesPendientes.getEmpleadoBD()));
		tmpSolicitud.setClieEmpresa((Cliente)this.convertirCarrierBdToModel(solicitudesPendientes.getEmpresaBD()));
		tmpSolicitud.setFechaEmision(solicitudesPendientes.getFecha_emision());
		tmpSolicitud.setEstado(solicitudesPendientes.getEstado());
		tmpSolicitud.setFechaCierre(solicitudesPendientes.getFecha_cierre());
		tmpSolicitud.setNroCorto(this.convertirNroCortoBdToModel(solicitudesPendientes.getConceptoBD()));
		tmpSolicitud.setObservaciones(solicitudesPendientes.getObservaciones());
		tmpSolicitud.setPrecio(solicitudesPendientes.getPrecio());
		tmpSolicitud.setTipo(solicitudesPendientes.getTipo());
		return tmpSolicitud;
	}

	private Empleado convertirEmpleadoBdToModel(EmpleadoBD empleado) {
//		TODO
		Empleado tmpEmpleado = new Comercial(empleado);
		return tmpEmpleado;
	}

	private Concepto convertirNroCortoBdToModel(ConceptoBD nroCorto) {
		Concepto tmpConcepto = null;
		if(nroCorto.getTipo().equalsIgnoreCase("numero_corto")){
			tmpConcepto = new NumCorto();
			((NumCorto)tmpConcepto).setCarrier(convertirCarrierBdToModel(nroCorto.getEmpresaBD()));
		}
		
		tmpConcepto.setCodConcepto(Integer.valueOf(nroCorto.getCodigo_concepto()));
		tmpConcepto.setNombreConcepto(nroCorto.getDescripcion());
		
		
		return tmpConcepto;
	}

	private Empresa convertirCarrierBdToModel(EmpresaBD empresaBD) {
		Empresa tmpEmpresa = null;
		if( empresaBD.getTipo_empresa().equalsIgnoreCase("Cliente")  )
		{
			tmpEmpresa = new Cliente();
		}
		else if( empresaBD.getTipo_empresa().equalsIgnoreCase("Carrier") ){
			tmpEmpresa = new Carrier();
		}
		tmpEmpresa.setCuit(empresaBD.getCuit());
		tmpEmpresa.setDireccionComercial(tmpEmpresa.getDireccionComercial());
		tmpEmpresa.setDomicilio(empresaBD.getDomicilio());
		tmpEmpresa.setEmail(empresaBD.getEmail());
//		tmpEmpresa.setFax(empresaBD.getFax());
		tmpEmpresa.setFechaAlta(empresaBD.getFecha_alta());
		tmpEmpresa.setFechaInhabilitacion(empresaBD.getFecha_inhabilitacion());
		tmpEmpresa.setCodigoEmpresa(empresaBD.getId_empresa());
		tmpEmpresa.setLocalidad(this.convertirLocalidadModelToBd(empresaBD.getLocalidad()));
		tmpEmpresa.setObservaciones(empresaBD.getObservaciones());
		tmpEmpresa.setPaginaWeb(empresaBD.getPagina_web());
		tmpEmpresa.setRazonSocial(empresaBD.getRazon_social());
		tmpEmpresa.setTelefono(empresaBD.getTelefono());
		tmpEmpresa.setTipoFactura(empresaBD.getTipo_factura());
		
		return tmpEmpresa;
	}

	private Localidad convertirLocalidadModelToBd(LocalidadBD localidad) {
		// TODO Auto-generated method stub
		
		return new Localidad(localidad);
	}

	public List<Campania> getCampaniasEmpresa(Empresa empresaComprobanteEnPantalla) throws Exception {
		List<Campania> campaniasCliente = iComprobantesFachade.getCampaniasCliente(empresaComprobanteEnPantalla);
		return campaniasCliente;
	}

	public UsuariosFachade getiUsuariosFachade() {
		return iUsuariosFachade;
	}
	
	public List<Campania> toNegocio(List<CampaniaBD> lista){
		
		List<Campania> res=new ArrayList<Campania>();
		
		for(int i=0;i<lista.size();i++){
			if(lista.get(i).getTipo().equalsIgnoreCase("Cobro")){
				res.add(new Cobro(lista.get(i)));
			}else{
				res.add(new Pago(lista.get(i)));
			}
		}
		return res;
	}

	public TraficoFachade getITraficoFachade() {
		return iTraficoFachade;
	}

	public void setITraficoFachade(TraficoFachade iTraficoFachade) {
		this.iTraficoFachade = iTraficoFachade;
	}
	
	public int getMaxDia(int per) {
		Calendar calendar = Calendar.getInstance();
		String s=String.valueOf(per);
		
		  int year = Integer.parseInt(s.substring(0, 4));
		  int month = Integer.parseInt(s.substring(4, 6))-1;
		  int date = 1;
		  calendar.set(year, month, date);
		  int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		  return maxDay;
	}
	
	
	public Date perToMinFecha(int per) {
		Calendar calendar = Calendar.getInstance();
		String s=String.valueOf(per);
		  int year = Integer.parseInt(s.substring(0, 4));
		  int month = Integer.parseInt(s.substring(4, 6))-1;
		  calendar.set(year, month, 1);
		  return calendar.getTime();
	}
	
	public Date perToMaxFecha(int per) {
		Calendar calendar = Calendar.getInstance();
		String s=String.valueOf(per);
		  int year = Integer.parseInt(s.substring(0, 4));
		  int month = Integer.parseInt(s.substring(4, 6))-1;
		  int date = 1;
		  calendar.set(year, month, date);
		  date=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		  calendar.set(year, month, date);
		  return calendar.getTime();
	}

	
	public List<TraficoNumCorto> bdToNegocio(List<TraficoNumCortoBD> lista) throws Exception{
		
		List<TraficoNumCorto> res=new ArrayList<TraficoNumCorto>();
		
		for(int i=0;i<lista.size();i++){
			TraficoNumCorto t= new TraficoNumCorto(lista.get(i));
			res.add(t);
		}
		
		return res;		
	}


	public void setICampaniasFachade(CampaniaFachade iCampaniasFachade) {
		this.iCampaniaFachade = iCampaniasFachade;
	}


	public CampaniaFachade getICampaniasFachade() {
		return iCampaniaFachade;
	}

}
